import axios from 'axios'
import mj from './mj'

let UrlMap = {};

let http = axios.create({
    baseURL: '/mock',
    transformRequest: [function (data) {
        return data;
    }],
    transformResponse: [function (data) {
        return data;
    }],
    headers: {
        'Content-Type':"application/json"
    },
    timeout: 8000,
    withCredentials: false
});


/**
 * 基于axios封装的api请求工具类
 */
var Service = {

    /**
     * 绑定当前的预处理url配置对象
     * @param {Object}
     */
    bindUrls(map){
        UrlMap = map;
    },

    /**
     * 根据配置的url key值来格式化成真正的url
     * @param {Object} opts url配置信息对象
     * @param {String} opts.name url预处理字符串对应的键值名称
     * @param {String} opts.path url预处理字符串中的路径占位符KV对象
     * @param {String} opts.query url所接收的查询字段信息
     * @param {Object} opts.body post数据对象
     */
    _formatUrl(opts) {
        let {name,path,query}=opts;
        let url = UrlMap[name];

        for (var p in path) {
            url = url.replace("\{" + p + "\}", path[p]);
        }
        for (var q in query) {
            if (url.indexOf('?') == -1) {
                url += "?";
            }
            url += "&" + q + "=" + query[q]
        }
        return url;
    },

    /**
     * 向服务端发送请求
     * @param {Object} param url配置信息对象
     * @param {String} param.name url预处理字符串对应的键值名称
     * @param {String} param.path url预处理字符串中的路径占位符KV对象
     * @param {String} param.query url所接收的查询字段信息
     * @param {Object} param.body post数据对象
     * @param {String} [method='GET'] method  http请求类型
     * @returns {Promise}
     */
    fetch(param, method = "GET"){
        let url = Service._formatUrl(param);
        let config = {
            url,
            method
        }

        if(param.body){
            config.data=JSON.stringify(param.body);
        }

        return new Promise(function (yes, no) {
            http.request(config)
                .then(function (response) {
                    yes(response.data);
                })
                .catch(function (error) {
                    console.log(error);
                    no(error)
                })
        })
    }
}

export default Service